package demo;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.task.Task;

/**
 * <p>类描述：。</p>
 *
 * @author 贾亮
 * @version v1.0.0.1。
 * @since JDK1.8。
 * <p>创建日期：2018/3/2 11:20。</p>
 */
public class TaskComplete {
    public static void main(String[] args) throws Exception {
        // 如果resource下没有默认的activiti.cfg.xml配置文件，可以通过以下两种方法获取ProcessEngine
//        方法一
//        ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti1.cfg.xml");

//        方法二
//        InputStream inputStream = new FileInputStream("src/main/resources/activiti.cfg.xml");
//        ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(inputStream);

//        启动Activiti
//        ProcessEngine engine = processEngineConfiguration.buildProcessEngine();
        // 创建流程引擎
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        // 得到流程存储服务组件
        RepositoryService repositoryService = engine.getRepositoryService();
        // 得到运行时服务组件
        RuntimeService runtimeService = engine.getRuntimeService();
        // 获取流程任务组件
        TaskService taskService = engine.getTaskService();
        // 提供对流程角色数据进行管理的API
        IdentityService identityService = engine.getIdentityService();
        // 提供对流程引擎进行管理和维护的服务
        ManagementService managementService = engine.getManagementService();
        // 对流程的历史数据进行操作，包括查询、删除这些数据。
        HistoryService historyService = engine.getHistoryService();
        // 创建DeploymentBuilder实例
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
        // 修改部署名称
        deploymentBuilder.name("测试");
        // 添加classpath下的资源
        deploymentBuilder.addClasspathResource("MyProcess.bpmn");
        // 过滤重复部署(包括资源名称和资源内容，牵涉两张表act_ge_bytearray(资源对象)和act_re_deployment(部署对象))
        deploymentBuilder.enableDuplicateFiltering();
        // 执行部署(写入到数据库中)
        Deployment deployment = deploymentBuilder.deploy();
        // 启动流程
        runtimeService.startProcessInstanceByKey("myProcess");
        // 查询第一个任务
        Task task = taskService.createTaskQuery().singleResult();
        System.out.println("第一个任务完成前，当前任务名称：" + task.getName());
        // 完成第一个任务
        taskService.complete(task.getId());
        // 查询第二个任务
        task = taskService.createTaskQuery().singleResult();
        System.out.println("第二个任务完成前，当前任务名称：" + task.getName());
        // 完成第二个任务（流程结束）
        taskService.complete(task.getId());
        task = taskService.createTaskQuery().singleResult();
        System.out.println("流程结束后，查找任务：" + task);
        // 关闭流程引擎
//        engine.close();
        // 结束当前正在运行中的java虚拟机
        // System.exit(0)是正常退出程序，而System.exit(1)或者说非0表示非正常退出程序。
        // 退出
        System.exit(0);

    }
}
